package com.cci.kangdao.aop;

import com.cci.kangdao.utilTool.AESTool;
import com.cci.kangdao.utilTool.HTMLUtils;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;

/**
 *表单重写 HttpServletRequestWrapper
 */
@Getter
public class ModifyParametersWrapper extends HttpServletRequestWrapper {

    // 所有参数的Map集合
    private Map<String, String[]> parameter;

    public ModifyParametersWrapper(HttpServletRequest request) {
        super(request);
        parameter = request.getParameterMap();
    }

    /**
     * 获取所有参数名
     *
     * @return 返回所有参数名
     */
    @Override
    public Enumeration getParameterNames() {
        Vector vector = new Vector(parameter.keySet());
        return vector.elements();
    }

    /**
     * 获取指定参数名的值，如果有重复的参数名，则返回第一个的值 接收一般变量 ，如text类型
     *
     * @param name 指定参数名
     * @return 指定参数名的值
     */
    @Override
    public String getParameter(String name) {
        String[] results = parameter.get(name);
        if (results == null || results.length <= 0){
            return null;
        }
        else {
            return results[0];
        }
    }

    /**
     * 获取指定参数名的解密后的所有值的数组
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] results = parameter.get(name);
        return results;
    }

    /**
     * 解密
     */
    public void getParameterDecrpty(String[] fieldArray) {
        // 获取所有参数集合
        Map<String, String[]> parameterMap = new HashMap<>(this.getParameterMap());
        for(String[] value:parameterMap.values()){
            int length = value.length;
            for (int i = 0; i < length; i++) {
                value[i] = HTMLUtils.stringFilter(value[i]);
            }
        }
        if(this.needDecrpty()){
            //所有需要解密字段进行解密
            for(String field : fieldArray){
                if(parameterMap.containsKey(field)){
                    String[] results = parameterMap.get(field);
                    if (results != null && results.length > 0){
                        int length = results.length;
                        for (int i = 0; i < length; i++) {
                            results[i] = AESTool.decryptString(results[i]);
                        }
                    }
                    parameterMap.put(field,results);
                }
            }
            // 将集合存到自定义HttpServletRequestWrapper
            this.setParameterMap(parameterMap);
        }
    }

    public void setParameterMap(Map<String, String[]> parameterMap) {
        this.parameter = parameterMap;
    }

    /**
     * 是否需要解密
     *
     * @return
     */
    public boolean needDecrpty() {
        String results = this.getParameter("isEncrypt");
        if (StringUtils.isNotBlank(results)) {
            if("1".equals(results)){
                return true;
            }
        }
        return false;
    }

}
